package com.zzyl.service;

import com.zzyl.base.PageResponse;
import com.zzyl.dto.PendingTasksDto;
import com.zzyl.entity.*;
import io.swagger.models.auth.In;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.List;
import java.util.Map;

/**
 * @author itheima
 */
public interface ActFlowCommService {

    /**
     * 启动流程实例，并且自动执行首页点
     * @param id                   业务id
     * @param user                 当前登录用户
     * @param processDefinitionKey 流程定义的key
     * @param variables            流程变量参数
     * @param isAuto               是否自动完成
     */
    void start(Long id, User user, String processDefinitionKey, Map<String, Object> variables, boolean isAuto);


    /**
     *
     * @param processDefinitionKey 流程定义key
     * @param businessKey 业务key
     * @return
     */
    Long getNextAssignee(String processDefinitionKey, String businessKey);

    PageResponse<PendingTasks> myTaskInfoList(PendingTasksDto pendingTasksDto);

    /**
     * 完成任务
     * @param title 标题
     * @param taskId 任务Id
     * @param userId 用户Id
     * @param code ops（1：通过  2：拒绝  3：驳回）
     * @param status 审核状态（1：申请中 2：已完成 3：已关闭）
     */
    void completeProcess(String title, String taskId, String userId, Integer code, Integer status);

    /**
     * 判断当前任务formKey是否与状态匹配
     * @param taskId 当前登录人的任务Id
     * @param flowStatus 前端传递的流程状态
     * @param dbFlowStatus 数据库的状态（单子的最终状态）
     * @return
     */
    int isCurrentUserAndStep(String taskId, Integer flowStatus,Integer dbFlowStatus);

    void closeProcess(String taskId, Integer taskStatusClosed);

    void rollBackTask(String taskId, boolean b);

    /**
     * 分页查询我的任务列表（代办 | 我的申请）
     * @param pendingTasksDto
     * @return
     */
    PageResponse<PendingTasks> getMyTaskList(PendingTasksDto pendingTasksDto);

    /**
     * 撤回任务
     *
     * @param taskId
     * @param first  是否默认退回流程第一个节点，true 是,false默认是上一个节点，
     */
    public void withdrawTask(String taskId, boolean first);

    /**
     * 申请人撤销任务
     * @param taskId
     */
    void cancleProcess(String taskId);
}
